package com.example.demo1.common;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 言初
 * Date: 2024-06-21
 * Time: 0:39
 */

// 密码工具类


public class PasswordUtils {

    // 一会写完加密和解密之后，就可以
    // 去注册代码部分进行对密码的加密存储，
    // 去登录的代码部分去对密码进行加密的验证了


    // 加盐加密
    public static String encrypt(String password){
        // 1. 盐值
        // 这个randomUUID方法生成的是35位，因为里面有 - ，所以需要把 - 去掉就是32位了：
        String salt = UUID.randomUUID().toString().replace("-","");
        // 2. 将盐值+密码进行 md5 得到最终密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
        // 3. 将盐值和最终密码进行返回
        return salt+"$"+finalPassword;
    }



    // 解密（加盐验证）
    // password ：待验证密码
    // dbPassword ：数据库中的密码：盐值+分隔符+最终密码（加密后的密码）
    public static boolean decrypt(String password,String dbPassword){

        // 如果待验证密码和数据库中的密码有一个为空或者为null，
        // 或者说数据库中存储的密码的长度不是65（盐值32位，最终密码也是32位，还有1位分隔符），
        // 就直接返回false，就不用往下执行了：
        if(!StringUtils.hasLength(password) || !StringUtils.hasLength(dbPassword) ||
        dbPassword.length() != 65){
            return false;
        }

        // 1. 得到盐值
        // 记得 给 $ 进行转义
        String[] dbPasswordArray = dbPassword.split("\\$");
        if(dbPasswordArray.length != 2){
            return false;
        }
        // 盐值
        String salt = dbPasswordArray[0];
        // 数据库中存的 最终密码：
        String dbFinalPassword = dbPasswordArray[1];

        // 2. 对待验证密码进行加密
        String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
        // 3. 对加过密的两个密码进行对比
        if(finalPassword.equals(dbFinalPassword)){
            return true;
        }
        return false;
    }


    // 测试加密、解密方法的单元测试
    /*public static void main(String[] args) {
        System.out.println(encrypt("123"));
        System.out.println(encrypt("123"));
        System.out.println(encrypt("123"));
        // 原始密码虽然是一样的，但是一加密就都变成不一样的了
        // 输出结果：
        // 801395515703446ab899c033f0c20806$992c9adb07edfbcdb0e53c96beab2650
        // e37e5711beae4187918d2b3b5f8f18fb$a6b56c125cfe56f1cd8610524a77167f
        // 30f2b352de75402684e0446b77eedabe$cdf0b260a579253bacb0a095e5f74549

        String dbPassword = "801395515703446ab899c033f0c20806$992c9adb07edfbcdb0e53c96beab2650";
        System.out.println("正确："+decrypt("123",dbPassword));
        System.out.println("错误："+decrypt("1234",dbPassword));
        // 正确：true
        // 错误：false
    }*/

}
